from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from appium.options.android import UiAutomator2Options

                                               
"""
appium安装： npm install -g appium
安装uiautomator2： appium driver install uiautomator2
安装andriod-sdk
安装jdk
配置环境变量

启动appium服务：appium
"""


"""
 Selenium 4.0+ 版本中，webdriver.Remote() 方法需要显式传入 options 参数（不再支持仅用 desired_capabilities）。
 这是 Selenium 4 引入的重大变更，要求使用类型化的 Options 类替代传统的 desired_capabilities 字典。
导入对应浏览器的 Options 类
Chrome 用 from selenium.webdriver.chrome.options import Options
Firefox 用 from selenium.webdriver.firefox.options import Options
Edge 用 from selenium.webdriver.edge.options import Options
Appium 移动端用 from appium.options.android import UiAutomator2Options（Android）或 from appium.options.ios import XCUITestOptions（iOS）
"""


# 配置连接参数
desired_caps = {
    # 移动设备平台（Android或iOS）
    "platformName": "Android",
    # 设备名称，通过adb devices命令获取
    "deviceName": "emulator-5554",  # 实际设备可改为设备序列号
    # Android系统版本号
    "platformVersion": "9.0",
    # 要启动的应用包名
    # "appPackage": "com.android.settings",  # 这里以系统设置为例
    # 应用的启动Activity
    # "appActivity": ".Settings",
    # 不重置应用状态
    "noReset": True,
    # 自动化引擎
    "automationName": "UiAutomator2",
    # 允许Unicode输入
    "unicodeKeyboard": True,
    # 重置键盘
    "resetKeyboard": True,
    "no_reset": True,
    "full_reset":False,
    "dontStopAppOnReset": True,
    "ignoreHiddenApiPolicyError": True,
    "options.skip_server_installation": True,
    "skip_device_initialization": True,
}

options = UiAutomator2Options().load_capabilities(desired_caps)

# options.platform_name = "Android"
# options.device_name = "emulator-5554"  # 设备序列号
# options.app_package = "com.android.settings"  # 应用包名
# options.app_activity = ".Settings"  # 启动 Activity
# #跑错时设置：ettings delete global hidden_api_policy_pre_p_apps;settings delete global hidden_api_policy_p_apps;settings delete global hidden_api_policy'' exited with code 255'; Command output:Exception occurred while executing 'delete':
# options.ignore_hidden_api_policy_error = True  

# options.skip_server_installation = True    # 跳过 uiautomator2 server 的安装
# options.skip_device_initialization = True    # 跳过设备初始化操作，包括安装APK
# options.no_reset = True    # 不重置应用状态
# options.full_reset = False    # 重置应用状态


# 连接Appium服务器，默认地址是http://127.0.0.1:4723
driver = webdriver.Remote("http://127.0.0.1:4723", options=options)

driver.find_element(AppiumBy.ID, "com.android.launcher3:id/preview_background").click()
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "设置").click()
time.sleep(10)
driver.quit()
"""
下载安装andriod-sdk。查看可连接设备
Android 设备需开启「开发者模式」和「USB 调试」，然后通过 ADB 命令:
adb devices

"""


"""
执行还是报错，定位日志发现还是权限问题：Failed to set setting keys 'hidden_api_policy_pre_p_apps,hidden_api_policy_p_apps,hidden_api_policy' to '1'.
主流 Android 模拟器（如 Android Studio 模拟器、夜神模拟器）默认对调试更友好，权限限制较少
adb shell pm grant io.appium.settings android.permission.WRITE_SECURE_SETTINGS ：报错
adb root ： 也会报错拿不到权限
"""
                           